<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    /*
    函数：
    1.科里化：一个函数原本有多个参数，只传入一个参数，生成一个新函数，由新函数接收剩下的参数来运行得到结果
    2.偏函数:一个函数原本有多个参数，只传入一一部分参数，生成一个新函数，由新函数接收剩下的参数来运行得到结果
    3.高阶函数
    为什么使用函数的科里化：为了提升性能，使用科里化可以缓存一部分能力。
    两个案例来说明科里化
    1：判断元素：vue本质是使用html的字符串作为模板，将字符串的模板转为AST(抽象语法树)，再转为vnode
    模板 -> AST (最消耗性能，字符串解析)
    AST -> VNode （抽象语法树转为vnode和我们的真实dom转为vnode差不多，也不是很消耗性能）
    VNode -> DOM(渲染到页面)   （我们前边已经通过vnode转换为html标签了，只有一个递归的操作，创建dom，加属性，并不消耗性能）
    哪个步骤最消耗性能：
      操作dom浏览器不断的渲染，刷新，第一个，内存中操作dom不会消耗
      在vue中，每个标签可以是真正的html标签，也可以是自定义组件，如何区分？？
      枚举。
      在vue源码中其实将所有可用的html标签已经存起来了
      假设这里只考虑几个标签
      案例一：判断是自定义组件还是真正的html标签
      let tags = 'div,p,a,img,span'.split(',');
      function makeMap(keys) {
        let set = {};
        tags.forEach(key => set[key] = true)
        // set = {div:true, p:true, span:true}
        return function(tagName) {
          return !!set[tagName.toLowerCase()]
        }
      }
      // 返回的是函数，在整个判断过程中，不论判断多少个组件，只forEach遍历一次
      let isHtmlTag = makeMap(tags) 

      makeMap(['div', 'p', 'span']) 需要遍历这个数据生成键值对
      let set = {
        div: true,
        p: true,
        span: true
      }
      set['div']  true
      set['Navigator']  undefined === 转为boolean，false，


      案例二： vue项目模板转换为抽象语法树需要执行几次？？？？
      1. 页面一加载需要渲染
      2.每个属性（响应式）数据在发生改变的时候 要渲染
      3. watch，computed 等等
      前几个文件的代码，每次需要渲染的时候，模板就会被解析一次
      render的作用是将虚拟dom转换为真实dom加到页面中
      虚拟dom可以降级理解为AST
      一个项目运行时模板是不会变得，就表示AST是不会变的
      我们可以将代码进行优化，将虚拟dom缓存起来，生成一个函数，函数只需要传入数据，就可以得到真正的dom

      波兰表示法？？？

    */
  </script>
</body>
</html>